home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok72.lha / while-Interpreter / Interpreter.dok < prev    next >
Text File  |  1993-08-15  |  6KB  |  170 lines

  1. while Interpreter von:
  2. ^^^^^^^^^^^^^^^^^^^^^^
  3.  
  4.           Dieter Seidel
  5.           Einsteinstr. 19
  6.           
  7.      7410 Reutlingen
  8.      
  9.           West Germany            Datum: 24.07.1992
  10.  
  11.  
  12. Copyright:
  13. ^^^^^^^^^^
  14.  
  15.    Das hier veröffentlichten Programme und die dazugehörigen Modula-2 Source
  16.    Codes sind PD-Freeware, unterliegen damit dem Copyright von Dieter
  17.    Seidel. Sie dürfen also jederzeit kopiert werden und weitergegeben werden.
  18.    Die Benutzung und Weitergabe bezieht sich aber nur für nicht-kommerzielle
  19.    (also Schüler/Studenten, Hobby usw.), wird für das Kopieren mehr als
  20.    5,--DM verlangt ist das kommerziell, Zwecke.
  21.    Desweiteren untersage ich jedwede Veröffentlichung
  22.    der !veränderten! Modula-2 Source Codes bzw. Programme.
  23.    Sollen diese Programme in andere Serien ausser AMOK und Fred Fish
  24.    aufgenommen werden, wird meine schriftliche Einverständniserklärung
  25.    benötigt.
  26.    
  27.  
  28. Hardware-Voraussetzungen:
  29. ^^^^^^^^^^^^^^^^^^^^^^^^^
  30.  
  31.    Der Interpreter läuft auf allen Amiga's. Der Start sollte jedoch vom CLI
  32.    erfolgen. Ich habe jedoch ein Script eingerichtet, so das das Programm
  33.    auch von der Workbench aufgerufen werden kann. Hierzu wird jedoch IconX
  34.    im C: Ordner verlangt.
  35.  
  36.  
  37. Entwicklung:
  38. ^^^^^^^^^^^^
  39.  
  40.    Dieses Programm entstand nach einer Übungs-aufgabe im WS 91/92 der
  41.    Universität Karlsruhe im Fach Informatik III.
  42.    Nachdem ich 99.9% des Programmes in diesem Semester fertiggestellt habe,
  43.    benötigte ich ersteinmal ein halbes Jahr um mich damit wieder zu
  44.    beschäftigen. Ich habe gestern nur einen Fehler in den Unterprogramm
  45.    Routinen U3 und U4 entfernt und das ganze nocheinmal getestet.
  46.    Eigentlich wollte ich noch einiges mehr einbauen, was mir jetzt
  47.    allerdings zu viel ist. Damit ist die Arbeit an diesem Programm
  48.    für mich beendet.
  49.  
  50.  
  51. Der Interpreter:
  52. ^^^^^^^^^^^^^^^^
  53.  
  54.    Die Syntax von while-Programmen lehnt sich sehr stark an die Syntax von
  55.    Pascal-Programmen an. Damit dürfte es kein Problem sein eigene Programme
  56.    dafür zu entwickeln.
  57.    Für Nicht-Informatiker: Ein while-Programm entspricht in etwa einer
  58.                            Turing Maschine. Nicht mehr und nicht weniger.
  59.                            Damit ist es ziemlich sinnlos größere Programme
  60.                            damit schreiben zu wollen.
  61.                            Es stehen nur while Schleifen und Zuweisungen zur
  62.                            Verfügung.
  63.  
  64.    Es existieren folgende Befehle (in Klammern die Abkürzungen für die
  65.    Programmeingabe) :
  66.  
  67.    begin            [b]
  68.    end              [e]
  69.    while x1 # x2 do [wx1#x2d]    ; Schleife
  70.    :=               [:]          ; Zuweisung
  71.    succ             [s]          ; Nachfolger x:=x+1
  72.    pred             [p]          ; Vorgänger  x:=x-1
  73.    Xn               [Xn]         ; Variable X mit einer beliebigen Zahl n
  74.                                  ; Z.B.: X0, X1, X123 ...
  75.  
  76.    Achtung: Es stehen nur die Variablen X0, X1, ... X99 zur Verfügung.
  77.             Diese sind, entsprechend der Definition von while Programmen,
  78.             als CARDINAL definiert.
  79.  
  80.    Nach der Eingabe des Programmes mit Hilfe der in den eckigen Klammern
  81.    stehenden Abkürzungen, wird die Quadrupeldarstellung des Programmes
  82.    berechnet und das Programm nochmals ausgegeben.
  83.  
  84.    Dabei besteht ein Quadrupel aus:
  85.  
  86.    1. Die Zeilennummer. Jeder Befehl hat seine eigene, beginnend bei 1 und
  87.       fortlaufend numeriert. Die Anweisungen `begin' und `end' bekommen
  88.       keine Zeilennummern.
  89.    2. Die Anweisung in Kurzform.
  90.    3. Die Zeilennummer die als nächstes auszuführen ist. Bei einer
  91.       while Schleife ist es die nächste Zeile.
  92.       Bei einer Zuweisung ist es entweder die Abfrage einer while Schleife
  93.       oder die nächste Zeile.
  94.    4. Die Zeilennummer die als nächstes auszuführen ist, falls ein
  95.       while Konstrukt zu einem FALSE geführt hat. Siehe auch Punkt 3.
  96.  
  97.    Falls bis jetzt kein Fehler aufgetreten ist, wird der Interpreter
  98.    aufgerufen.
  99.  
  100.    Die Fragen die hier gestellt werden, sollten selbsterklärend sein, bis
  101.    auf die letzte.
  102.  
  103.    Ich habe die while Syntax so erweitert, daß es möglich ist vordefinierte
  104.    Unterprogramme aufzurufen. Diese sind Addition, Subtraktion,
  105.    Multiplikation, Division und Rest der Division. 
  106.    Dabei wird einfach U1, U2, ... U5 für das entsprechende Unterprogramm
  107.    eingegeben. Die Variablen X0, X1, ... X9 werden für die Funktionswerte
  108.    benötigt.
  109.  
  110.  
  111. Beispiel:
  112. ^^^^^^^^^
  113.  
  114.    Schreiben Sie ein while Programm, das X1:=MAXIMUM(X2,X3,X4) berechnet.
  115.  
  116.    X2, X3 und X4 sind die Eingabevariablen, X1 die Ausgabevariable.
  117.  
  118.    Testen Sie dieses Programm für X2:=2, X3:=4 und X4:=3.
  119.  
  120.    Und dies ist die Lösung die man so eingeben sollte. Die Besitzer von OS 2.0
  121.    können das folgende Programm einfach mit der Maus ausschneiden.
  122.    Allen anderen wünsche ich viel Spaß beim abtippen.
  123.  
  124. bx1:0;x2:2;x3:4;x4:3;x5:0;
  125. wx2#x5dbx1:s(x1);x2:p(x2);x3:p(x3);x4:p(x4)e;
  126. wx3#x5dbx1:s(x1);x3:p(x3);x4:p(x4)e;
  127. wx4#x5dbx1:s(x1);x4:p(x4)e
  128. e
  129.  
  130.    Der Interpreter erzeugt dann:
  131.  
  132. ( 1;X1:0      ; 2; 2)    X1:=0;
  133. ( 2;X2:2      ; 3; 3)    X2:=2;
  134. ( 3;X3:4      ; 4; 4)    X3:=4;
  135. ( 4;X4:3      ; 5; 5)    X4:=3;
  136. ( 5;X5:0      ; 6; 6)    X5:=0;
  137. ( 6;X2#X5     ; 7;11)    while X2 # X5 do
  138.                            begin
  139. ( 7;X1:s(X1)  ; 8; 8)        X1:=succ(X1);
  140. ( 8;X2:p(X2)  ; 9; 9)        X2:=pred(X2);
  141. ( 9;X3:p(X3)  ;10;10)        X3:=pred(X3);
  142. (10;X4:p(X4)  ; 6; 6)        X4:=pred(X4)
  143.                            end;
  144. (11;X3#X5     ;12;15)    while X3 # X5 do
  145.                            begin
  146. (12;X1:s(X1)  ;13;13)        X1:=succ(X1);
  147. (13;X3:p(X3)  ;14;14)        X3:=pred(X3);
  148. (14;X4:p(X4)  ;11;11)        X4:=pred(X4)
  149.                            end;
  150. (15;X4#X5     ;16;18)    while X4 # X5 do
  151.                            begin
  152. (16;X1:s(X1)  ;17;17)        X1:=succ(X1);
  153. (17;X4:p(X4)  ;15;15)        X4:=pred(X4)
  154.                            end
  155.                        end
  156.  
  157.  
  158. Beispiel:
  159. ^^^^^^^^^
  160.  
  161.    Schreiben Sie ein Programm, das die Summe von X1 = 7 und X2 = 3 berechnet.
  162.  
  163.    Lösung:
  164.  
  165. bX1:7X2:3U1e
  166.  
  167.    Hier benutze ich ein Unterprogramm, welches normalerweise nicht erlaubt
  168.    ist.
  169.  
  170.